package com.lichuandi.abstrct;

// 抽象模板类

/**
 * 模板方法模式
 */
public abstract class ReportGenerator {
    // 模板方法
    public final void generateReport() {
        // 调用抽象方法
        collectData();
        // 调用默认方法
        processData();
        // 调用钩子方法
        formatReport();
        // 调用私有方法
        if (shouldSendEmail()) {
            // 调用私有方法
            sendEmail();
        }
    }

    /**
     * 抽象方法，子类必须实现
     */
    protected abstract void collectData();
    /**
     * 抽象方法，子类必须实现
     */
    protected abstract void processData();

    /**
     * 默认方法，子类可以选择覆盖或继承
     */
    protected void formatReport() {
        System.out.println("Formatting report in default format...");
    }

    /**
     * 钩子方法，决定是否发送邮件
     * @return true if email should be sent, false otherwise
     */
    // Hook方法
    protected boolean shouldSendEmail() {
        return false;
    }

    /**
     * 私有方法，封装发送邮件的逻辑
     */
    private void sendEmail() {
        System.out.println("Sending report via email...");
    }
}

// 具体实现
